#include"../mqcommon/mq_helper.hpp"
#include"../mqcommon/mq_logger.hpp"
#include"../mqcommon/mq_msg.pb.h"
#include"../mqserver/mq_message.hpp"

#include<gtest/gtest.h>

bitmq::MessageManager::ptr mmp;
class messageTest:public testing::Environment{
    virtual void SetUp()override
    {
        mmp=std::make_shared<bitmq::MessageManager>("./data/message/");
        mmp->initQueueMessage("queue1");
    }
    virtual void TearDown()override
    {
        mmp->clear();
    }

};



//插入消息测试
TEST(message_test,insert_test)
{
    bitmq::BasicProperties properties;
    properties.set_id(bitmq::UUIDHelper::uuid());
    properties.set_routing_key("news.music.top");
    properties.set_delivery_mode(bitmq::DeliveryMode::DURABLE);
    mmp->insert("queue1",&properties,"Hello world1",true);
    mmp->insert("queue1",nullptr,"Hello world2",bitmq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"Hello world3",bitmq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"Hello world4",bitmq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"Hello world5",false);

    ASSERT_EQ(mmp->getable_count("queue1"),5);
    ASSERT_EQ(mmp->ack_count("queue1"),0);
    ASSERT_EQ(mmp->durable_count("queue1"),4);
    ASSERT_EQ(mmp->total_count("queue1"),4);
}

//挑选消息，在未确认之前
// TEST(message_test,select_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"),5);
//     bitmq::MessagePtr msg1=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg1.get(),nullptr);
//     ASSERT_EQ(msg1->payload().body(),std::string("Hello world1"));
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
//     ASSERT_EQ(mmp->ack_count("queue1"),1);


//     bitmq::MessagePtr msg2=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg2.get(),nullptr);
//     ASSERT_EQ(msg2->payload().body(),std::string("Hello world2"));
//     ASSERT_EQ(mmp->getable_count("queue1"),3);
//     ASSERT_EQ(mmp->ack_count("queue1"),2);

//     bitmq::MessagePtr msg3=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg3.get(),nullptr);
//     ASSERT_EQ(msg3->payload().body(),std::string("Hello world3"));
//     ASSERT_EQ(mmp->getable_count("queue1"),2);
//     ASSERT_EQ(mmp->ack_count("queue1"),3);

//     bitmq::MessagePtr msg4=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg4.get(),nullptr);
//     ASSERT_EQ(msg4->payload().body(),std::string("Hello world4"));
//     ASSERT_EQ(mmp->getable_count("queue1"),1);
//     ASSERT_EQ(mmp->ack_count("queue1"),4);


//     bitmq::MessagePtr msg5=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg5.get(),nullptr);
//     ASSERT_EQ(msg5->payload().body(),std::string("Hello world5"));
//     ASSERT_EQ(mmp->getable_count("queue1"),0);
//     ASSERT_EQ(mmp->ack_count("queue1"),5);
// }

//对一条消息进行确认
// TEST(message_test,delete_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
//     bitmq::MessagePtr msg1=mmp->getFrontMessage("queue1");
//     ASSERT_NE(msg1.get(),nullptr);
//     ASSERT_EQ(msg1->payload().body(),std::string("Hello world1"));
//     mmp->ack("queue1",msg1->payload().properties().id());
//     ASSERT_EQ(mmp->getable_count("queue1"),3);
//     ASSERT_EQ(mmp->durable_count("queue1"),3);
//     ASSERT_EQ(mmp->ack_count("queue1"),0);
// }
//销毁测试
TEST(message_test, clear) {
    mmp->destroyQueueMessage("queue1");
}
int main(int argc,char*argv[])
{
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new messageTest);
    RUN_ALL_TESTS();
    return 0;
}
